package com.example.chapter06;

import android.app.Application;
import android.content.res.Configuration;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Environment;
import android.util.Log;

import androidx.room.Room;

import com.example.chapter06.database.BookDatabase;
import com.example.chapter06.database.ShoppingDBHelper;
import com.example.chapter06.entity.GoodsInfo;
import com.example.chapter06.util.FileUtil;
import com.example.chapter06.util.SharedUtil;

import java.io.File;
import java.util.HashMap;
import java.util.List;

public class MyApplication extends Application {

    private static MyApplication mApp;
    // 声明一个公共的信息映射对象，可当作全局变量使用
    public HashMap<String, String> infoMap = new HashMap<>();

    public BookDatabase bookDatabase;
    public int goodsCount = 0; // 商品数量

    public static MyApplication getInstance() {
        return mApp;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        mApp = this;
        Log.d("MyApplication", "onCreate() 启动");

        // 构建书籍数据库的实例
        bookDatabase = Room.databaseBuilder(this, BookDatabase.class, "book")
                .addMigrations()
                // 允许在主线程中查询数据（Room 默认不允许在主线程中操作数据库）
                .allowMainThreadQueries()
                .build();

        // 初始化商品信息
        initGoodsInfo();
    }

    private void initGoodsInfo() {
        // 获取共享参数保存的是否首次打开参数
        boolean isFirst = SharedUtil.getInstance(this).readBoolean("first", true);
        // 获取当前App的私有存储路径
        String directory = getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS).toString() + File.separatorChar;
        if (isFirst) {
            // 模拟网络图片下载
            List<GoodsInfo> goodsList = GoodsInfo.getDefaultList();
            for (GoodsInfo info : goodsList) {
                Bitmap bitmap = BitmapFactory.decodeResource(getResources(), info.pic);
                // 把图片保存到存储卡中
                String picPath = directory + info.id + ".jpg";
                FileUtil.saveImage(picPath, bitmap);
                bitmap.recycle(); // 回收图片对象
                info.picPath = picPath; // 把图片路径保存到商品信息中
            }

            // 打开数据库，把商品信息插入到商品信息表中
            ShoppingDBHelper shoppingDBHelper = ShoppingDBHelper.getInstance(this);
            shoppingDBHelper.openWriteLink();
            shoppingDBHelper.insertGoodsInfo(goodsList);
            shoppingDBHelper.closeLink();

            // 把是否首次打开的参数写入共享参数
            SharedUtil.getInstance(this).writeBoolean("first", false);
        }
    }

    @Override
    public void onTerminate() {
        super.onTerminate();
        Log.d("MyApplication", "onTerminate() 终止");
    }

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        Log.d("MyApplication", "onConfigurationChanged() 配置改变");
    }

    public BookDatabase getBookDB() {
        return bookDatabase;
    }
}

/*
在 AndroidManifest.xml 中注册 MyApplication 类，如下所示：
android:name=".MyApplication"
将 activity 标签中的 android:name 属性值改为 .MainActivity
来测试 MyApplication 类的生命周期方法。
 */
